package santeclair.referentiel.optique.model;

import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

import santeclair.lunar.framework.annotation.Code;
import santeclair.lunar.framework.annotation.HashCodeEquals;
import santeclair.lunar.framework.annotation.ToString;
import santeclair.lunar.framework.util.EqualsUtils;
import santeclair.lunar.framework.util.HashCodeUtils;
import santeclair.lunar.framework.util.ToStringUtils;
import santeclair.referentiel.optique.config.Constant;

/**
 * @author cquintin
 */
@Entity
@Table(name = "tr_distributeur_optique", catalog = Constant.SCHEMA_NAME, uniqueConstraints = @UniqueConstraint(columnNames = "code_distributeur_optique"))
public class DistributeurOptique implements Serializable {

    private static final long serialVersionUID = -2269271941283660078L;
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "identifiant_distributeur_optique", unique = true, nullable = false)
    @HashCodeEquals
    @ToString
    private Integer identifiantDistributeurOptique;

    @Code
    @Column(name = "code_distributeur_optique", unique = true, nullable = false, length = 10)
    @HashCodeEquals
    @ToString
    private String codeDistributeurOptique;

    @Column(name = "libelle_distributeur_optique", nullable = false, length = 255)
    @HashCodeEquals
    @ToString
    private String libelleDistributeurOptique;

    @Column(name = "code_opto10_distributeur_optique", unique = false, nullable = false, length = 50)
    @HashCodeEquals
    @ToString
    private String codeOpto10DistributeurOptique;

    // bi-directional many-to-many association to EnseigneOptique
    @ManyToMany
    @JoinTable(name = "tl_enseigne_distributeur", catalog = Constant.SCHEMA_NAME, joinColumns = {@JoinColumn(name = "identifiant_distributeur_optique", nullable = false)}, inverseJoinColumns = {@JoinColumn(name = "identifiant_enseigne_optique", nullable = false)})
    @HashCodeEquals
    @ToString
    private List<EnseigneOptique> enseignesDistributeurs;

    public DistributeurOptique() {
    }

    /**
     * @return the identifiantDistributeurOptique
     */
    public Integer getIdentifiantDistributeurOptique() {
        return identifiantDistributeurOptique;
    }

    /**
     * @param identifiantDistributeurOptique the identifiantDistributeurOptique to set
     */
    public void setIdentifiantDistributeurOptique(Integer identifiantDistributeurOptique) {
        this.identifiantDistributeurOptique = identifiantDistributeurOptique;
    }

    /**
     * @return the codeDistributeurOptique
     */
    public String getCodeDistributeurOptique() {
        return codeDistributeurOptique;
    }

    /**
     * @param codeDistributeurOptique the codeDistributeurOptique to set
     */
    public void setCodeDistributeurOptique(String codeDistributeurOptique) {
        this.codeDistributeurOptique = codeDistributeurOptique;
    }

    /**
     * @return the libelleDistributeurOptique
     */
    public String getLibelleDistributeurOptique() {
        return libelleDistributeurOptique;
    }

    /**
     * @param libelleDistributeurOptique the libelleDistributeurOptique to set
     */
    public void setLibelleDistributeurOptique(String libelleDistributeurOptique) {
        this.libelleDistributeurOptique = libelleDistributeurOptique;
    }

    /**
     * @return the codeOpto10DistributeurOptique
     */
    public String getCodeOpto10DistributeurOptique() {
        return codeOpto10DistributeurOptique;
    }

    /**
     * @param codeOpto10DistributeurOptique the codeOpto10DistributeurOptique to set
     */
    public void setCodeOpto10DistributeurOptique(String codeOpto10DistributeurOptique) {
        this.codeOpto10DistributeurOptique = codeOpto10DistributeurOptique;
    }

    /**
     * @return the enseignesDistributeurs
     */
    public List<EnseigneOptique> getEnseignesDistributeurs() {
        return enseignesDistributeurs;
    }

    /**
     * @param enseignesDistributeurs the enseignesDistributeurs to set
     */
    public void setEnseignesDistributeurs(List<EnseigneOptique> enseignesDistributeurs) {
        this.enseignesDistributeurs = enseignesDistributeurs;
    }

    @Override
    public String toString() {
        return ToStringUtils.toString(this);
    }

    @Override
    public int hashCode() {
        return HashCodeUtils.hashCode(this);
    }

    @Override
    public boolean equals(Object obj) {
        return EqualsUtils.isEqual(this, obj);
    }

}
